import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { ElMessage } from 'element-plus'
import { tokenManager } from '@/utils/token'
import { login as loginApi } from '@/api/port'
import type { LoginRequest, LoginResponse } from '@/types/api'

export const useUserStore = defineStore('user', () => {
  // 状态 - 只存储用户信息，token由tokenManager管理
  const userInfo = ref<LoginResponse['userInfo'] | null>(null)
  
  // 计算属性
  const isLoggedIn = computed(() => {
    return !!userInfo.value && tokenManager.hasToken()
  })
  
  // 检查token是否有效（未过期）
  const isTokenValid = computed(() => {
    return tokenManager.hasToken()
  })
  
  // 自动检查token过期
  const checkTokenExpiration = () => {
    if (tokenManager.hasToken()) {
      logout()
      ElMessage.warning('登录已过期，请重新登录')
      return false
    }
    return true
  }
  
  const username = computed(() => {
    return userInfo.value?.username || '用户'
  })
  
  // 初始化用户信息（从本地存储或其他持久化方式获取）
  const initUserInfo = () => {
    if (tokenManager.hasToken()) {
      // 用户信息需要从其他地方获取，比如本地存储或重新请求API
      // 这里可以添加从localStorage获取用户信息的逻辑
      const savedUserInfo = localStorage.getItem('userInfo')
      if (savedUserInfo && savedUserInfo != '') {
        try {
          userInfo.value = JSON.parse(savedUserInfo)
        } catch (error) {
          console.error('解析用户信息失败:', error)
        }
      }
    }
  }
  
  // 登录
  const login = async (loginForm: LoginRequest): Promise<boolean> => {
    try {
      // 模拟API调用
      await new Promise(resolve => setTimeout(resolve, 1000))
      
      // 模拟登录成功响应
      const mockResponse = {
        code: 200,
        message: '登录成功',
        success: true,
        data: {
          token: generateMockToken(loginForm.userName),
          userInfo: {
            id: 1,
            userName: loginForm.userName,
            email: `${loginForm.userName}@example.com`,
            avatar: '',
            roles: ['user']
          }
        }
      }
      
      // 存储用户信息
      userInfo.value = mockResponse.data.userInfo
      // 同时保存到localStorage
      localStorage.setItem('userInfo', JSON.stringify(mockResponse.data.userInfo))
      // token由tokenManager管理
      tokenManager.setToken(mockResponse.data.token)
      
      ElMessage.success('登录成功')
      return true
    } catch (error) {
      ElMessage.error('登录失败，请检查用户名和密码')
      return false
    }
  }
  
  // 退出登录
  const logout = () => {
    userInfo.value = null
    tokenManager.clearToken()
    // 清除localStorage中的用户信息
    localStorage.removeItem('userInfo')
  }
  
  // 生成模拟token（24小时过期）
  const generateMockToken = (username: string, userId: number = 1): string => {
    const mockPayload = {
      id: userId,
      username,
      iat: Math.floor(Date.now() / 1000),
      exp: Math.floor(Date.now() / 1000) + 24 * 60 * 60 // 24小时后过期
    }
    return `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.${btoa(JSON.stringify(mockPayload))}.mock_signature`
  }
  
  // 更新用户信息
  const updateUserInfo = (info: Partial<LoginResponse['userInfo']>) => {
    if (userInfo.value) {
      userInfo.value = { ...userInfo.value, ...info }
    }
  }
  
  return {
    // 状态
    userInfo,
    
    // 计算属性
    isLoggedIn,
    isTokenValid,
    username,
    
    // 方法
    initUserInfo,
    login,
    logout,
    updateUserInfo,
    checkTokenExpiration
  }
})